home *** CD-ROM | disk | FTP | other *** search
/ Mission 3 / Mission 3.zip / Mission 3.iso / demovers / scripter / libs / math.lib < prev    next >
Text File  |  1998-09-26  |  3KB  |  219 lines

  1. proc sin(x)
  2. local i, n, t, x2, p, s;
  3. {
  4.     x = float(x);
  5.     if (x < 0) i = 1, x = -x;
  6.     n = round(x / (p = pi()));
  7.     x -= p * n;
  8.     if (n % 2) x = -x;
  9.  
  10.     t = x;
  11.     x2 = - x * x;
  12.     for (n = 3.0; ; n += 2.0) {
  13.         s = x + (t *= x2 / (n * (n - 1.0)));
  14.         if (x == s) return i ? -s : s;
  15.         x = s;
  16.     }
  17. }
  18.  
  19. proc cos(x)
  20. {
  21.     return sin(x + pi() / 2);
  22. }
  23.  
  24. proc tan(x)
  25. local d;
  26. {
  27.     if ((d = cos(x)) == 0) throw("bad value", x);
  28.     return sin(x) / d;
  29. }
  30.  
  31. proc cot(x)
  32. local d;
  33. {
  34.     if ((d = sin(x)) == 0) throw("bad value", x);
  35.     return cos(x) / d;
  36. }
  37.  
  38. proc arctan(x)
  39. local a, i, n, pi4, s, t, z;
  40. {
  41.     x = float(x);
  42.     if (x < 0) i = 1, x = -x;
  43.     pi4 = 0.25 * pi();
  44.     while (x >= 0.415) a += pi4, x = (x - 1.0) / (x + 1.0);
  45.  
  46.     t = x;
  47.     z = - x * x;
  48.  
  49.     for (n = 3.0; ; n += 2.0) {
  50.         s = x + (t *= z) / n;
  51.         if (s == x) {
  52.             s += a + (t * z) / (n + 2);
  53.             return i ? -s : s;
  54.         }
  55.         x = s;
  56.     }
  57. }
  58.  
  59. proc arcsin(x)
  60. {
  61.     if (x < -1 || x > 1) throw("bad value", x);
  62.     if (x == 1 || x == -1) return 0.5 * pi();
  63.     return arctan(x / sqrt(1 - x*x));
  64. }
  65.  
  66. proc arccos(x)
  67. {
  68.     if (x < -1 || x > 1) throw("bad value", x);
  69.     if (x == -1) return pi();
  70.     if (x == 1) return 0.0;
  71.     return 0.5 * pi() - arctan(x / sqrt(1 - x*x));
  72. }
  73.  
  74. proc arccot(x)
  75. {
  76.     return 0.5 * pi() - arctan(x);
  77. }
  78.  
  79. proc sinh(x)
  80. local e;
  81. {
  82.     e = exp(x);
  83.     return 0.5 * (e - 1/e);
  84. }
  85.  
  86. proc cosh(x)
  87. local e;
  88. {
  89.     e = exp(x);
  90.     return 0.5 * (e + 1/e);
  91. }
  92.  
  93. proc tanh(x)
  94. local e, f;
  95. {
  96.     e = exp(x);
  97.     f = 1 / e;
  98.     return (e - f) / (e + f);
  99. }
  100.  
  101. proc coth(x)
  102. local e, f;
  103. {
  104.     if (x == 0) throw("bad value", x);
  105.     e = exp(x);
  106.     f = 1 / e;
  107.     return (e + f) / (e - f);
  108. }
  109.  
  110. proc arsinh(x)
  111. {
  112.     x = float(x);
  113.     return ln(x + sqrt(x*x + 1));
  114. }
  115.  
  116. proc arcosh(x)
  117. {
  118.     x = float(x);
  119.     if (x < 1) throw("bad value", x);
  120.     return ln(x + sqrt(x*x - 1));
  121. }
  122.  
  123. proc artanh(x)
  124. {
  125.     if (x <= -1 || x >= 1) throw("bad value", x);
  126.     return 0.5 * ln((1 + x) / (1 - x));
  127. }
  128.  
  129. proc arcoth(x)
  130. {
  131.     x = float(x);
  132.     if (x >= -1 && x <= 1) throw("bad value", x);
  133.     return 0.5 * ln((x + 1) / (x - 1));
  134. }
  135.  
  136. proc exp(x)
  137. local d, f, n, p, q, s, y;
  138. {
  139.     x = float(x);
  140.     if (x < 0) q = 1, x = -x;
  141.     if (x > 1) x /= (d = float("1e" + string(exponent(x) + 1)));
  142.  
  143.     y = x + 1;
  144.     f = 1.0;
  145.     p = x;
  146.  
  147.     for (n = 2.0; ; n += 1.0) {
  148.         s = y + (p *= x) / (f *= n);
  149.         if (y == s) {
  150.             s += (p *= x) / (f *= (n + 1.0));
  151.             s += (p * x) / (f * (n + 2.0));
  152.             if ((d = int(d)) > 0) s = pow(s, d);
  153.             return q ? 1 / s : s;
  154.         }
  155.         y = s;
  156.     }
  157. }
  158.  
  159. proc ln(x)
  160. local f, n, s, t, y;
  161. {
  162.     x = float(x);
  163.     if (x <= 0) throw("bad value", x);
  164.  
  165.     f = 2.0;
  166.     while (x >= 2) f = f + f, x = sqrt(x);
  167.     while (x <= 0.5) f = f + f, x = sqrt(x);
  168.  
  169.     t = y = (x - 1) / (x + 1);
  170.     x = t * t;
  171.  
  172.     for (n = 3.0; ; n += 2.0) {
  173.         s = y + (t *= x) / n;
  174.         if (y == s) return f * s;
  175.         y = s;
  176.     }
  177. }
  178.  
  179. proc log10(x)
  180. {
  181.     if (x <= 0) throw("bad value", x);
  182.     return ln(x) / ln(10.0);
  183. }
  184.  
  185. proc sqrt(x)
  186. local e, y, yn;
  187. {
  188.     if (x < 0) throw("bad value", x);
  189.     if (x == 0) return 0.0;
  190.  
  191.     e = exponent(x) + 1;
  192.     y = e & 1 ? 1.581 : 0.5;
  193.     if (e >>= 1) y *= float("1e" + string(e));
  194.  
  195.     forever {
  196.         yn = 0.5 * (y + x/y);
  197.         if (yn == y) return yn;
  198.         y = yn;
  199.     }
  200. }
  201.  
  202. proc pow(x, a)
  203. local q, y;
  204. {
  205.     x = float(x);
  206.     if (a.type != "integer") return exp(a * ln(x));
  207.  
  208.     a = int(a);
  209.     if (a < 0) a = -a, q = 1;
  210.     y = 1.0;
  211.  
  212.     for (; a; a >>= 1) {
  213.         if (a & 1) y *= x;
  214.         x = x * x;
  215.     }
  216.  
  217.     return q ? 1/y : y;
  218. }
  219.